package cn.zzz.openplatform.amap.model.direction;

import cn.hutool.core.annotation.Alias;
import cn.zzz.openplatform.amap.model.AmapOpenApiResponse;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.util.List;

/**
 * 驾车路径规划响应结果
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class AmapDrivingDirectionResponse extends AmapOpenApiResponse {
    /**
     * 路线信息
     */
    private Route route;

    @Data
    public static class Route {
        /**
         * 起点坐标
         */
        private String origin;

        /**
         * 终点坐标
         */
        private String destination;

        /**
         * 打车费用, 单位：元
         */
        @Alias("taxi_cost")
        private BigDecimal taxiCost;

        /**
         * 驾车换乘方案列表
         */
        private List<Path> paths;
    }

    @Data
    public static class Path {
        /**
         * 行驶距离, 单位：米
         */
        private Integer distance;

        /**
         * 预计行驶时间, 单位：秒
         */
        private Integer duration;

        /**
         * 导航策略
         */
        private String strategy;

        /**
         * 此导航方案道路收费, 单位：元
         */
        private Double tolls;

        /**
         * 限行结果
         * 0 代表限行已规避或未限行，即该路线没有限行路段
         * 1 代表限行无法规避，即该线路有限行路段
         */
        private Integer restriction;

        /**
         * 红绿灯个数
         */
        @Alias("traffic_lights")
        private Integer trafficLights;

        /**
         * 收费路段距离, 单位：米
         */
        @Alias("toll_distance")
        private Integer tollDistance;

        /**
         * 导航路段
         */
        private List<Step> steps;
    }

    @Data
    public static class Step {
        /**
         * 行驶指示
         */
        private String instruction;

        /**
         * 方向
         */
        private String orientation;

        /**
         * 道路名称
         */
        private String road;

        /**
         * 此路段距离, 单位：米
         */
        private Integer distance;

        /**
         * 此段收费, 单位：元
         */
        private Double tolls;

        /**
         * 收费路段距离, 单位：米
         */
        @Alias("toll_distance")
        private Integer tollDistance;

        /**
         * 主要收费道路
         */
        @Alias("toll_road")
        private String tollRoad;

        /**
         * 此路段坐标点串
         */
        private String polyline;

        /**
         * 导航主要动作
         */
        private String action;

        /**
         * 导航辅助动作
         */
        @Alias("assistant_action")
        private String assistantAction;

        /**
         * 驾车导航详细信息
         */
        private List<Tmc> tmcs;
    }

    @Data
    public static class Tmc {
        /**
         * 此段路的长度, 单位：米
         */
        private Integer distance;

        /**
         * 此段路的交通情况
         * 可选值：未知、畅通、缓行、拥堵、严重拥堵
         */
        private String status;

        /**
         * 此段路的轨迹
         */
        private String polyline;
    }
}
